package jdklearning.net;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

import java.net.URL;
import java.net.URLConnection;

/**
 * @author shenenlu 2021年05月17日 上午11:38:53
 */
public class UrlAndConnection {

    /**
     * ConnectTimeout
     *
     * 指的是建立连接所用的时间，适用于网络状况正常的情况下，两端连接所用的时间。
     * 在java中，网络状况正常的情况下，例如使用 HttpClient 或者 HttpURLConnection 连接时设置参数 connectTimeout=5000 即5秒，如果连接用时超过5秒就是抛出 java.net.SocketException: connect time out 的异常。
     *
     * ReadTimeout
     *
     * 指的是建立连接后从服务器读取到可用资源所用的时间。
     * 在这里我们可以这样理解ReadTimeout：正常情况下，当我们发出请求时可以收到请求的结果，也就是页面上展示的内容，但是当网络状况很差的时候，就会出现页面上无法展示出内容的情况。
     * 另外当我们使用爬虫或者其他全自动的程序时，无法判断当前的网络状况是否良好
     * ，此时就有了ReadTimeout的用武之地了，通过设置ReadTimeout参数，
     * 例：ReadTimeout=5000，超过5秒没有读取到内容时
     * ，就认为此次读取不到内容并抛出Java.net.SocketException: read time out的异常。
     * @throws IOException
     *
     */
    public static void timeoutTest() throws IOException {
        URL url = new URL("http://www.aaa.com");
        URLConnection urlConnection = url.openConnection();
        urlConnection.setConnectTimeout(3000);
        urlConnection.setReadTimeout(8000);
        Object content = urlConnection.getContent();
        System.out.println(content);
    }



    public static void getContent() throws IOException{
//        URL url = new URL("http://www.itmind.net");
        URL url = new URL("https://www.baidu.com");
        URLConnection connection = url.openConnection();

        try (InputStream in = connection.getInputStream();) {

            ByteArrayOutputStream output = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len = -1;
            while ( (len = in.read(buffer)) != -1 ) {
                output.write(buffer, 0, len);
            }

            System.out.println(output);
//            System.out.println(new String(output.toByteArray()));

        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    /**
     * URL 和 URLConnection 最大的不同在于：
     *
     * URLConnection 提供了对 HTTP 头部的访问；
     * URLConnection 可以配置发送给某个 URL 的请求参数；
     * URLConnection 不仅可以读取 URL 定位的资源，还可以向其写入数据。
     *
     * @throws IOException
     */
    public static void urlAndConnection() throws IOException{
        URL url = new URL("http://www.itmind.net");
        URLConnection connection = url.openConnection();
        System.out.println(connection.getContentType());
        System.out.println(connection.getContentLength());
        System.out.println(connection.getContentEncoding());
        System.out.println(connection.getDate());
        System.out.println(connection.getExpiration());
        System.out.println(connection.getLastModified());
    }


    public static void main(String[] args) throws IOException {
        timeoutTest();
//        urlAndConnection();
//        getContent();
    }

}
